package com.cskaoyan.javase.operator.shift6;

/**
 * @description: （移）位运算符
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 1，位运算符牵扯到底层数据处理，比较难，但是这个东西不是重点
 *  如果能够听得懂，更好
 *  位运算符是直接对整数的二进制位进行计算的运算符
 *  好处是效率高，所以这个东西广泛出现在算法题目当中，但是对于企业级Java开发来说，这个东西提升的一丢丢效率是微不足道的
 *
 *  << 按位左移运算符
 *  在一定的范围内，每左移一位，就是相当于乘2，移动n位，相当于成2的n次方
 *  但是思考一下，是否是无限制的？
 *
 *  >> 按位有符号右移运算符
 *  每左移一位，就是相当于除以2，移动n位，相当于除以2的n次方
 *
 *  >>>无符号按位右移
 *  对于正数而言，和有符号的没区别
 *  对于负数而言，负数用这个一定变成了一个正数
 *
 *  Math.pow()
 *  比如说你有需求，你不会做，百度或者谷歌
 *  求一个数的几次方Java
 *
 *  经典灵魂拷问：
 *      怎么算 2*16 最高效？
 *
 */
public class Demo {
    public static void main(String[] args) {
        //System.out.println(0.1>>2); Operator '>>' cannot be applied to 'double', 'int'

        System.out.println(21 << 2); //84=21*4
        System.out.println(21 >> 2); //除不尽的小数位就被抛弃了
        int a = ~21;
        System.out.println(~a);

        double d = Math.pow(2,3);
        System.out.println(d);

        System.out.println("------------------");
        System.out.println(2<<4);
    }
}
